// 数据库种子数据生成脚本
const { PrismaClient } = require('@prisma/client');
const { hash } = require('bcrypt');
const { v4: uuidv4 } = require('uuid');

// 初始化Prisma客户端
const prisma = new PrismaClient();

// 示例文档内容
const sampleDocContent = {
  type: "doc",
  content: [
    {
      type: "heading",
      attrs: { level: 1 },
      content: [{ type: "text", text: "协作文档编辑示例" }]
    },
    {
      type: "paragraph",
      content: [
        { type: "text", text: "这是一个使用真实数据库的协作文档示例。您可以邀请其他用户一起编辑此文档。" }
      ]
    },
    {
      type: "heading",
      attrs: { level: 2 },
      content: [{ type: "text", text: "多人协作功能" }]
    },
    {
      type: "paragraph",
      content: [
        { type: "text", text: "当有多人同时编辑时，您可以看到：" }
      ]
    },
    {
      type: "bulletList",
      content: [
        {
          type: "listItem",
          content: [
            {
              type: "paragraph",
              content: [{ type: "text", text: "其他用户的光标位置" }]
            }
          ]
        },
        {
          type: "listItem",
          content: [
            {
              type: "paragraph",
              content: [{ type: "text", text: "正在编辑的段落指示" }]
            }
          ]
        },
        {
          type: "listItem",
          content: [
            {
              type: "paragraph",
              content: [{ type: "text", text: "实时内容更新" }]
            }
          ]
        }
      ]
    },
    {
      type: "paragraph",
      content: [
        { type: "text", text: "修改此段落来测试实时协作功能。您的更改将实时保存到数据库。" }
      ]
    }
  ]
};

// 主要种子数据生成函数
async function main() {
  console.log('开始生成种子数据...');

  // 创建测试用户
  const testUser = await createTestUser();
  console.log(`已创建测试用户: ${testUser.name} (${testUser.email})`);

  // 创建测试项目
  const testProject = await createTestProject(testUser.id);
  console.log(`已创建测试项目: ${testProject.name}`);

  // 创建示例文档
  const testDocument = await createTestDocument(testProject.id, testUser.id);
  console.log(`已创建测试文档: ${testDocument.title}`);

  console.log('数据库种子数据生成完成!');
}

// 创建测试用户
async function createTestUser() {
  // 检查用户是否已存在
  const existingUser = await prisma.user.findFirst({
    where: {
      email: 'test@example.com'
    }
  });

  if (existingUser) {
    console.log('测试用户已存在，跳过创建');
    return existingUser;
  }

  // 创建测试用户
  const hashedPassword = await hash('password123', 10);
  return await prisma.user.create({
    data: {
      name: '测试用户',
      email: 'test@example.com',
      password: hashedPassword,
      emailVerified: new Date(),
      settings: {
        create: {
          theme: 'system',
          themeColor: 'blue',
          language: 'zh_CN'
        }
      },
      profile: {
        create: {
          bio: '这是一个测试账户'
        }
      }
    }
  });
}

// 创建测试项目
async function createTestProject(userId) {
  // 检查项目是否已存在
  const existingProject = await prisma.project.findFirst({
    where: {
      name: '协作测试项目'
    }
  });

  if (existingProject) {
    // 确保用户是项目成员
    const membership = await prisma.projectUser.findFirst({
      where: {
        projectId: existingProject.id,
        userId: userId
      }
    });

    if (!membership) {
      await prisma.projectUser.create({
        data: {
          projectId: existingProject.id,
          userId: userId,
          role: 'OWNER'
        }
      });
    }

    console.log('测试项目已存在，跳过创建');
    return existingProject;
  }

  // 创建新项目
  const project = await prisma.project.create({
    data: {
      name: '协作测试项目',
      description: '用于测试协作功能的项目',
      users: {
        create: {
          userId: userId,
          role: 'OWNER'
        }
      }
    }
  });

  return project;
}

// 创建测试文档
async function createTestDocument(projectId, userId) {
  // 检查文档是否已存在
  const existingDocument = await prisma.document.findFirst({
    where: {
      projectId: projectId,
      title: '协作编辑测试文档'
    }
  });

  if (existingDocument) {
    console.log('测试文档已存在，跳过创建');
    return existingDocument;
  }

  // 创建文档
  const document = await prisma.document.create({
    data: {
      title: '协作编辑测试文档',
      projectId: projectId,
      content: sampleDocContent,
      version: 1,
      createdById: userId,
      updatedById: userId,
      revisions: {
        create: {
          content: sampleDocContent,
          version: 1,
          createdById: userId
        }
      }
    }
  });

  return document;
}

// 运行种子数据生成
main()
  .catch(e => {
    console.error('种子数据生成失败:', e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  }); 